package com.mfnote.view.write;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.text.Editable;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;

import com.mfnote.util.image.ImageManager;
import com.mfnote.view.R;
import com.mfnote.view.R.id;
import com.mfnote.view.R.layout;
import com.mfnote.view.R.style;
import com.mfnote.view.chatemoji.FileUtils;

/**
 * 记事本编辑框
 * @author ZHF
 *
 */
public class WriteEditText extends EditText  {

	public Context mContext;
	// 保存于内存中的表情HashMap
	private HashMap<String, String> emojiMap = new HashMap<String, String>();
	
	private String imagePath;//插入图片的路径
	int index = 0; //图片路径索引
	
	SpannableString spannableString;
	
	PopupWindow mPopupWindow = null;//弹出对话框
	ArrayList<String> list;

	public WriteEditText(Context context) {
		super(context);
		mContext = context;
	}
	

	/** 获取内容“打算打算[开心]是[伤心]酣睡大叔的” **/
	public void insetBitmap(String content, String imagPath) {
		this.imagePath = imagPath; //获取保存的图片路径
		// 解析其中的[表情]“打算打算[开心]是[伤心]酣睡大叔的”
		spannableString = getExpressionString(mContext, content);
		// System.out.print(spannableString);
		append(spannableString);
	}

	/** 得到一个SpannableString对象,通过传入的字符串，并进行正则判断 **/
	public SpannableString getExpressionString(Context context, String str) {
		SpannableString spannableString = new SpannableString(str);
		// 正则表达式比配字符串里是否含有表情，如： 我好[开心]啊 编辑框内的数据[可爱][笑脸]
		String zhengze = "\\[[^\\]]+\\]";
		Pattern pattern = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE); // 大小写敏感
		try {
			// 首先从配置文件中获取到，List<String>保存列表
			ParseData(FileUtils.getEmojiFile(context), context);
			dealExpression(context, spannableString, pattern, 0);
		} catch (Exception e) {
			Log.e("dealExpression", e.getMessage());
		}
		return spannableString;
	}

	/** 对spanableString进行正则判断，如果符合要求，则以表情图片代替 **/
	private void  dealExpression(Context context,SpannableString spannableString, Pattern pattern, int start) {
		
		int end = 0; //要替换的字符串的长度
		// 匹配器
		Matcher matcher = pattern.matcher(spannableString);
		while (matcher.find()) {
			String key = matcher.group(); // 得到匹配的字符串
			// 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
			if (matcher.start() < start) {
				continue; // 跳出当前，回到外层循环开始位置
			}
			String value = emojiMap.get(key);
			if (TextUtils.isEmpty(value)) {
					//匹配到[img]之后，bitmap 
				if(!imagePath.equals("")) {
					ArrayList<String> list = new ImageManager(mContext).str2List(imagePath);
					while (index < list.size() ) {  //可能会出现多张图片的情况 
						String imgPath = list.get(index);
						if(!imgPath.equals("")) {
							Bitmap bitmap = BitmapFactory.decodeFile(imgPath);
							if(bitmap != null) {
								bitmap = Bitmap.createScaledBitmap(bitmap, 60, 60, true);// 创建一张可以缩放的位图
								// 通过图片路径得到bitmap,用一个ImageSpan来包装
								ImageSpan imageSpan = new ImageSpan(bitmap);
								// 计算该图片名字的长度，也就是要替换的字符串的长度
								end = matcher.start() + "[img]".length();
								// 将该图片替换字符串中规定的位置中
								spannableString.setSpan(imageSpan, matcher.start(), end,
										SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
								//获取下一个图片的路径
								index++;
							}
							break;
						}
						if (end < spannableString.length()) {
							// 如果整个字符串还未验证完，则继续。。
							dealExpression(context, spannableString, pattern, end);
						}
					 }
				}
				break;
			}else {
				// 通过上面匹配得到的字符串来生成图片资源id
				int resId = context.getResources().getIdentifier(value, "drawable",
						context.getPackageName());
	
				if (resId != 0) {
					Bitmap bitmap = BitmapFactory.decodeResource(
							context.getResources(), resId);
					bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true);// 创建一张可以缩放的位图
					// 通过图片资源的id得到bitmap,用一个ImageSpan来包装
					ImageSpan imageSpan = new ImageSpan(bitmap);
					// 计算该图片名字的长度，也就是要替换的字符串的长度
					int end2 = matcher.start() + key.length();
					// 将该图片替换字符串中规定的位置中
					spannableString.setSpan(imageSpan, matcher.start(), end2,
							SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
					if (end2 < spannableString.length()) {
						// 如果整个字符串还未验证完，则继续。。
						dealExpression(context, spannableString, pattern, end2);
					}
					break;
				}
			}
		}
	}

	/** 解析字符 eg:"emoji_1.png,[可爱]","emoji_2.png,[笑脸]" **/
	private void ParseData(List<String> data, Context context) {
		if (data == null) {
			return;
		}
		try {
			for (String str : data) {
				String[] text = str.split(",");
				String fileName = text[0]
						.substring(0, text[0].lastIndexOf("."));
				emojiMap.put(text[1], fileName); // {[可爱]=emoji_1}
				// 根据资源名称获取其ID
				// int resID =
				// context.getResources().getIdentifier(fileName,"drawable",context.getPackageName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/** 添加图片完成之后，在编辑框内留下位置[img],即超链接，连接到对应图片 **/
	public void setImage(String itemPath) {
		String imgName ="[img]";
		// 创建一个 SpannableString对象
		SpannableString sp = new SpannableString(imgName);
		Bitmap bitmap = BitmapFactory.decodeFile(itemPath);
		BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
		bitmapDrawable.setBounds(0, 0, 45,45);
		ImageSpan imageSpan = new ImageSpan(bitmapDrawable);
		
		Editable editable = getEditableText();  
		int selectedIndex = getSelectionStart();  //获取光标位置
		//将获取到的图片添加到sp中
		sp.setSpan(imageSpan, 0, imgName.length(),Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		if (selectedIndex < 0)  
		     append(sp);  
		else  
		    editable.insert(selectedIndex, sp); 
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Layout layout = getLayout();
		switch(event.getAction()) {
		case MotionEvent.ACTION_DOWN:  //按下打开图片
			if(spannableString != null && !spannableString.equals(""))  {  //开心[img0]哈哈[img0]
				//获取当前点的索引值
				int line = layout.getLineForVertical(getScrollY()+(int)event.getY());
				int index = layout.getOffsetForHorizontal(line, event.getX());
				Log.i("光标所在位置----》", index+"");
				
				//int spanIndex = 0; //用于区分是哪张图片
				
//				//图片字符串路径集合
//			    list = new ImageManager(mContext).str2List(imagePath);
				//根据情况来响应对应的事件
				ImageSpan[] imageSpans = spannableString.getSpans(0, spannableString.length(), ImageSpan.class);  
				ok:for (ImageSpan span : imageSpans)   {  
				    int start = spannableString.getSpanStart(span);  
				    int end = spannableString.getSpanEnd(span);
				    //向左右两边寻找"[img]"
				    if (index >= start && index <= end)  {//找到图片
					    //根据插入图片[img0]中数字来获取对应图片
//		    			 String imgPath = list.get(spanIndex);
//		    			 loadBigPictureDialog(imgPath);
				    	Toast.makeText(mContext, "查看大图，请点击下面图片列表", Toast.LENGTH_SHORT).show();
		    			break ok;
				    }
				}
			 }	
			break;
		case MotionEvent.ACTION_UP:
			//抬起手指
			break;
		}
		return super.onTouchEvent(event);
	}

	/**弹出放大的插入图片**/
	public   void loadBigPictureDialog(String itemPath) {
		
		final String temp = itemPath; //用于接收传来的某一项的图片地址
		
	    Dialog dialog_pic = new Dialog(mContext,R.style.simple_dialog);
		
		View view =  LayoutInflater.from(mContext).inflate(R.layout.newwrite_dialog_picture, null);
		
		ImageView imgView = (ImageView) view.findViewById(R.id.img_weibo_img);
		Button btnBig = (Button) view.findViewById(R.id.btn_big);
		btnBig.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(mContext,ImgDisplayActivity.class);
				intent.putExtra("imgUrl", temp); //将图片的路径传递过去
				mContext.startActivity(intent);
			}
		});
		dialog_pic.setContentView(view);
		dialog_pic.show();

		if(!itemPath.equals("")) {
			Bitmap tempBitmap = BitmapFactory.decodeFile(itemPath); //加载对应项的地址
			imgView.setImageBitmap(tempBitmap);//显示对应项的图片
		}
	}
	
	
}
